package com.cjlgb.design.upms.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.cjlgb.design.common.core.bean.ResultBean;
import com.cjlgb.design.common.mybatis.service.BaseService;
import com.cjlgb.design.upms.api.entity.SysRole;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * @author WFT
 * @date 2019/7/31
 * description: 系统角色相关业务接口
 */
public interface SysRoleService extends BaseService<SysRole> {

    /**
     * 查询角色列表
     * @param params 查询参数
     * @return List<SysRole>
     */
    default List<SysRole> list(SysRole params){
        LambdaQueryWrapper<SysRole> wrapper = Wrappers.lambdaQuery();
        //  不查询超级管理员角色,以防误操作
        wrapper.notIn(SysRole::getId,1);
        Optional.ofNullable(params).ifPresent(bean -> {
            //  根据角色名称模糊查询
            if (StringUtils.hasText(params.getName())){
                wrapper.likeRight(SysRole::getName,params.getName());
            }
        });
        return this.list(wrapper);
    }

    /**
     * 批量删除角色
     * @param idList 角色Id
     * @return ResultBean
     */
    ResultBean batchDelete(List<Long> idList);

    /**
     * 根据名称查询角色
     * @param name 角色名称
     * @param excludeId 排除此Id
     * @return SysMenu
     */
    default SysRole selectByName(String name,Long excludeId){
        LambdaQueryWrapper<SysRole> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(SysRole::getName, name);
        if (null != excludeId){
            wrapper.notIn(SysRole::getId, excludeId);
        }
        return this.getOne(wrapper);
    }

    /**
     * 创建角色
     * @param role 角色信息
     * @return ResultBean
     */
    default ResultBean createRole(SysRole role){
        //  校验角色名称唯一性
        Assert.isNull(this.selectByName(role.getName(), null),"角色名称已存在");
        //  保存角色
        LocalDateTime now = LocalDateTime.now();
        role.setCreateTime(now);
        role.setLastModifyTime(now);
        this.save(role);
        return ResultBean.ok();
    }

    /**
     * 修改角色
     * @param role 角色信息
     * @return ResultBean
     */
    default ResultBean editRole(SysRole role){
        //  校验角色名称唯一性
        Assert.isNull(this.selectByName(role.getName(), role.getId()),"角色名称已存在");
        role.setLastModifyTime(LocalDateTime.now());
        Assert.isTrue(this.updateById(role),"角色Id不存在");
        return ResultBean.ok();
    }

    /**
     * 更改角色的权限
     * @param role 角色信息
     * @return ResultBean
     */
    ResultBean changeAuthorities(SysRole role);

}
